package cn.tedu.lbs.basic.web.service;

import cn.tedu.lbs.basic.web.repository.AreaRepository;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tarena.lbs.pojo.basic.po.AreaPO;
import com.tarena.lbs.pojo.basic.vo.AreaVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
@Slf4j
public class AreaService {
    @Autowired
    private AreaRepository areaRepository;

    public List<AreaVO> childrenList(Integer parentId) {
        QueryWrapper<AreaPO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", parentId);
        return areaRepository.list(queryWrapper).stream().map(po->{
            AreaVO vo=new AreaVO();
            BeanUtils.copyProperties(po,vo);
            return vo;
        }).collect(Collectors.toList());
    }

    public List<AreaVO> tree() {
        //思考为了节省查询的效率 如何引用 缓存逻辑
        //考虑 在redis如何保存这个缓存数据 string hash list set zset
        //考虑缓存 执行的逻辑 判断命中 如果没命中 读取数据库组织数据 存到缓存 如果命中 直接返回
        //1.查询所有 行政区域 (还有一种方案 就是由于行政区域数据量比较多 每次需要封装什么读取什么)
        List<AreaPO> allAreas=getAllAreas();
        //2.装配计算成成List<AreaVO>
        List<AreaVO> vos=assembleTree(allAreas);
        return vos;
    }

    private List<AreaVO> assembleTree(List<AreaPO> allAreas) {
        log.info("封装树入参区域数量:{}",CollectionUtils.size(allAreas));
        //1.拿到所有省 转化vo 筛选所有po.parentId.equals(0)
        List<AreaPO> provinces= allAreas.stream().filter(po->po.getParentId().equals(0l)).collect(Collectors.toList());
        log.info("筛选的省区域:{}",provinces);
        //1.1将省级po 转化成vo;
        List<AreaVO> provinceVos=pos2vos(provinces);
        //2.拿到省进行遍历 获取省的id 作为筛选条件 从allArea筛选所有市
        for (AreaVO province : provinceVos) {
            List<AreaPO> cities=allAreas.stream().filter(po->po.getParentId().equals(province.getId())).collect(Collectors.toList());
            List<AreaVO> cityVos = pos2vos(cities);
            //3.拿到市列表 遍历 利用市的id 筛选区 给城市封装children
            for (AreaVO city : cityVos) {
                List<AreaPO> areas = allAreas.stream().filter(po -> po.getParentId().equals(city.getId())).collect(Collectors.toList());
                List<AreaVO> areaVos = pos2vos(areas);
                city.setChildren(areaVos);
            }
            //将每个省vo缺少的市列表补充
            province.setChildren(cityVos);
        }
        log.info("转化的省VO:{}",provinceVos);
        return provinceVos;
    }

    private List<AreaVO> pos2vos(List<AreaPO> provinces) {
        if (!CollectionUtils.isEmpty(provinces)){
            return provinces.stream().map(po->{
                AreaVO vo=new AreaVO();
                BeanUtils.copyProperties(po,vo);
                return vo;
            }).collect(Collectors.toList());
        }
        return null;
    }

    private List<AreaPO> getAllAreas() {
        return areaRepository.list();
    }
}
